package njust.csc.aecore.utils

import com.google.gson.Gson
import kotlinx.serialization.json.Json
import njust.csc.aecore.entity.APK
import java.nio.file.Path
import java.nio.file.StandardOpenOption
import kotlin.io.path.writeText

/**
 * @Author ZhouHang
 * @Date 24/6/15 周六
 */
object SerializeUtils {
    /**
     * 将 apk 以 json 格式序列化 append 到 outputPath 中
     * @param apk APK 待序列化的 apk 数据类
     * @param savePath Path 序列化字符串保存位置
     * @param append Boolean 是否追加
     * @return String 序列化后的 Json 字符串
     */
    fun dump(apk: APK, savePath: Path, append: Boolean = true): String {
        var right = StandardOpenOption.APPEND
        if (!append) right = StandardOpenOption.WRITE
        val apkInfo = apk.dump()
        savePath.writeText(
            text = apk.dump() + "\n",
            charset = Charsets.UTF_8,
            StandardOpenOption.CREATE,
            right
        )
        return apkInfo
    }

    /**
     * 将序列化字符串加载为 apk
     * @param apkInfo String apk Json 字符串
     * @return APK
     */
    fun load(apkInfo: String): APK {
        return Json.decodeFromString<APK>(apkInfo)
    }

    // gson 支持直接从 json 转化为 map
    private val gson = Gson()

    /**
     * 将一个 HashMap 转换为 Json 字符串
     * @param map HashMap<String, Any>
     * @return String
     */
    fun toJson(map: HashMap<String, Any>): String {
        return gson.toJson(map)
    }

    /**
     * 将 Json 字符串转换为 HashMap
     * @param jsonString String
     * @return Map<Any?, Any?>
     */
    fun toMap(jsonString: String): Map<Any?, Any?> {
        val resultMap: Map<Any?, Any?> = HashMap()
        return gson.fromJson(jsonString, resultMap.javaClass)
    }
}
